package code.class4;

/**
 * https://leetcode.cn/problems/minimum-size-subarray-sum/description/
 * 滑动窗口
 * 1、累加和大于等于target的最短数组长度
 * arr:[3,5,2,6,3,1,3,4,5,6,2,1]
 * target = 10
 */
public class Code01_minSubArrayLen {
    public static void main(String[] args) {
        int[] arr = {2,3,1,2,4,3};
        int target = 7;
        int i = minSubArrayLen(arr, target);
        System.out.println(i);
    }

    public static int minSubArrayLen(int[] arr, int target) {
        /**
         * sum:累加和
         * l:左边界
         * r:右边界
         * ans:最小长度
         */
        int sum = 0, l = 0, r = 0, ans = Integer.MAX_VALUE;
        for (; r < arr.length; r++) {
            // 先计算累加和
            sum += arr[r];
            // 判断累加和 - 左边界位置的值，是否超过target
            while (sum - arr[l] >= target) {
                sum -= arr[l++];
            }
            // 累加>=target时，修改最小范围
            if (sum >= target) {
                ans = Math.min(ans, r - l + 1);
            }
        }
        // 如果没变动，则为0，否则返回
        return ans == Integer.MAX_VALUE ? 0 : ans;
    }
}
